<?php
declare(strict_types=1);
/**
 * Author: Traveler
 * Time  : 2021/8/31 14:29
 */

namespace sunshine\basic;


use think\db\BaseQuery;
use think\helper\Str;
use think\Model;
use think\model\concern\SoftDelete;

/**
 * 基础模型类
 *
 * @package sunshine\basic
 */
abstract class BaseModel extends Model
{
    /**
     * 使用软删除
     */
    use SoftDelete;

    protected $deleteTime = 'delete_time';

    /**
     * 数据输出隐藏的属性
     *
     * @var array
     */
    protected $hidden = ['delete_time', 'pivot'];

    /**
     * 生成动态查询
     *
     * @param array $conditions 动态query条件
     * @param array $search     前端搜索参数
     * @param int   $page       分页参数
     * @param int   $limit      分页参数
     * @return BaseQuery
     */
    public function makeDynamicQuery(array $conditions = [], array $search = [], int $page = 1, int $limit = 0): BaseQuery
    {
        // 查询对象
        $query = $this->db();

        // 处理query相关方法
        foreach ($conditions as $method => $param) {
            if ($param) {
                $query->$method($param);
            }
        }

        // 处理前端搜索条件
        if ($search) {
            $query->withSearch($this->makeSearchFields($search), $search);
        }

        // 处理分页
        if ($limit > 0) {
            $query->page($page, $limit);
        }

        return $query;
    }

    /**
     * 生成可搜索字段
     *
     * @param array $search 前端搜索参数
     * @return array
     */
    public function makeSearchFields(array $search): array
    {
        // 只有定义了搜索器的字段才允许搜索
        return array_values(array_filter(array_keys($search), function ($field) {
            return method_exists($this, 'search' . Str::studly($field) . 'Attr');
        }));
    }
}